package mn.slide.laborberlin.refresh;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import mn.slide.laborberlin.db.DataLayer;
import mn.slide.laborberlin.db.DatabaseManager;
import mn.slide.laborberlin.model.Anhang;
import mn.slide.laborberlin.model.Eintrag;
import mn.slide.laborberlin.model.EntragData;
import mn.slide.laborberlin.model.Kapitel;
import mn.slide.laborberlin.model.Leistungsverzeichnis;
import mn.slide.laborberlin.model.SubUeberSchrift;
import mn.slide.laborberlin.model.UeberSchrift;
import mn.slide.laborberlin.model.UnterSuchung;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

public class XMLHandler extends DefaultHandler {

	String elementValue = null;
	boolean startKapitel = false;
	boolean startEintrag = false;
	boolean startUeberschrift = false;
	boolean startUntersuchung = false;
	boolean startSubUeberschrift = false;
	boolean startSerie = false;
	public List<Kapitel> data;
	boolean startAnhang = false;
	private HashMap<Integer, List<EntragData>> unterSuchungsAll;
	private List<EntragData> items;
	int kapiId = 1;
	int eintragId = 1;
	int ueberId = 1;
	int unterId = 1;
	int anhangId = 1;
	int subUeberId = 1;
	public Leistungsverzeichnis mainData = null;

	public Kapitel kapitelData = null;

	public Eintrag eintragData = null;

	public UeberSchrift ueberSchriftData = null;

	public UnterSuchung unterSuchungData = null;

	public SubUeberSchrift subUeberschriftData = null;

	public Anhang anhangData = null;

	public int anhagType;

	public List<Kapitel> getXMLData() {
		return data;
	}

	public void setXMLData(Leistungsverzeichnis data) {
		this.mainData = data;
	}

	public XMLHandler() {
		unterSuchungsAll = new HashMap<Integer, List<EntragData>>();
		DataLayer.layer.refresh = true;
	}

	/**
	 * This will be called when the tags of the XML starts.
	 **/
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {

		if (localName.equals("Leistungsverzeichnis")) {
			mainData = new Leistungsverzeichnis();
			elementValue = "";
		} else if (localName.equals("Kapitel")) {
			Log.v("Kapitel", "START");
			kapitelData = new Kapitel();
			kapitelData.setValue(attributes.getValue("value"));
			kapitelData.setKapitelId(kapiId);
			kapitelData.setId(kapiId);
			items = new ArrayList<EntragData>();
			kapiId++;
			anhagType = 1;
			startKapitel = true;
			elementValue = "";
		} else if (localName.equals("LayoutTyp")) {
			elementValue = "";
		} else if (localName.equals("Anhang")) {
			elementValue = "";
			switch (anhagType) {
			case 1:

				break;
			case 2:

				break;
			case 3:
				anhangData = new Anhang();
				anhangData.setId(anhangId);
				anhangId++;
				startAnhang = true;
				break;
			default:
				break;
			}

		} else if (localName.equals("Eintrag")) {
			elementValue = "";
			startEintrag = true;
			eintragData = new Eintrag();
			eintragData.setId(eintragId);
			eintragData.setEintragId(eintragId);
			eintragId++;
		} else if (localName.equals("Ueberschrift")) {
			elementValue = "";
			if (startUeberschrift) {
				startSubUeberschrift = true;
				subUeberschriftData = new SubUeberSchrift();
				subUeberschriftData.setId(subUeberId);
				subUeberId++;
				subUeberschriftData.setSubUeberId(subUeberId);
				subUeberschriftData.setValue(attributes.getValue("value"));
				anhagType = 4;
			} else {
				ueberSchriftData = new UeberSchrift();
				ueberSchriftData.setValue(attributes.getValue("value"));
				ueberSchriftData.setId(ueberId);
				ueberSchriftData.setUeberId(ueberId);
				ueberId++;
				anhagType = 2;
				startUeberschrift = true;
			}
		} else if (localName.equals("Untersuchung")) {
			elementValue = "";
			startUntersuchung = true;
			anhagType = 3;
			unterSuchungData = new UnterSuchung();
			unterSuchungData.setId(unterId);
			unterId++;
		} else if (localName.equals("Kuerzel")) {
			elementValue = "";
		} else if (localName.equals("Name")) {
			elementValue = "";
		} else if (localName.equals("Synonym")) {
			elementValue = "";
		} else if (localName.equals("MaterialKuerzel")) {
			elementValue = "";
		} else if (localName.equals("MaterialName")) {
			elementValue = "";
		} else if (localName.equals("MaterialAbnahmemenge")) {
			elementValue = "";
		} else if (localName.equals("Material")) {
			elementValue = "";
		} else if (localName.equals("Methode")) {
			elementValue = "";
		} else if (localName.equals("Kommentar")) {
			elementValue = "";
		} else if (localName.equals("BemerkungLV")) {
			elementValue = "";
		} else if (localName.equals("Preis")) {
			elementValue = "";
		} else if (localName.equals("Dauer")) {
			elementValue = "";
		} else if (localName.equals("Referenzbereich")) {
			elementValue = "";
		} else if (localName.equals("Einheit")) {
			elementValue = "";
		} else if (localName.equals("Allgemeines")) {
			elementValue = "";
		} else if (localName.equals("Indikation")) {
			elementValue = "";
		} else if (localName.equals("Praeanalytik")) {
			elementValue = "";
		} else if (localName.equals("Bewertung")) {
			elementValue = "";
		} else if (localName.equals("Durchfuehrung")) {
			elementValue = "";
		} else if (localName.equals("Kurzkommentar")) {
			elementValue = "";
		} else if (localName.equals("Serie")) {
			elementValue = "";
			startSerie = true;
			ueberSchriftData = new UeberSchrift();
			ueberSchriftData.setId(ueberId);
			ueberSchriftData.setUeberId(ueberId);
			ueberId++;
		} else {
			String html = "<" + localName;
			String atr1 = attributes.getValue("class");
			String atr2 = attributes.getValue("width");
			String atr3 = attributes.getValue("align");
			String atr4 = attributes.getValue("valign");

			if (atr1 != null) {
				html = html + " " + "class=\"" + atr1 + "\"";
			}
			if (atr2 != null) {
				html = html + " " + "width=\"" + atr2 + "\"";
			}
			if (atr3 != null) {
				html = html + " " + "align=\"" + atr3 + "\"";
			}
			if (atr4 != null) {
				html = html + " " + "valign=\"" + atr4 + "\"";
			}
			elementValue = elementValue + html + ">";
		}

	}

	/**
	 * This will be called when the tags of the XML end.
	 **/
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {

		if (localName.equals("Leistungsverzeichnis")) {
			Log.v("Parse", "End");
			DataLayer.layer.refresh = false;
			// DataLayer.layer.setUnterSuchungsAll(unterSuchungsAll);
		} else if (localName.equals("Kapitel")) {
			Log.v("Kapitel", "END");
			unterSuchungsAll.put(kapitelData.getId(), items);
			DatabaseManager.getInstance().addKapitel(kapitelData);
		} else if (localName.equals("LayoutTyp")) {
			kapitelData.setLayoutType(Integer.parseInt(elementValue));
		} else if (localName.equals("Anhang")) {
			switch (anhagType) {
			case 1:

				break;
			case 2:

				break;
			case 3:

				unterSuchungData.setAnhang(anhangData);
				anhangData.setUnter(unterSuchungData);
				anhagType = 0;
				DatabaseManager.getInstance().addAnhang(anhangData);
				startAnhang = false;
				break;
			default:
				break;
			}
		} else if (localName.equals("Eintrag")) {
			eintragData.setKapitel(kapitelData);
			DatabaseManager.getInstance().addEintrag(eintragData);
			startEintrag = false;
		} else if (localName.equals("Ueberschrift")) {
			if (!startSubUeberschrift) {
				items.add(ueberSchriftData);
				ueberSchriftData.setEintrag(eintragData);
				eintragData.setUeberItem(ueberSchriftData);
				DatabaseManager.getInstance().addUeberSchrift(ueberSchriftData);
				startUeberschrift = false;
			} else {
				subUeberschriftData.setUeberSchrift(ueberSchriftData);
				DatabaseManager.getInstance().addSubUeberSchrift(
						subUeberschriftData);
				startSubUeberschrift = false;
			}
		} else if (localName.equals("Untersuchung")) {
			if (startSerie) {
				ueberSchriftData.setValue(unterSuchungData.getName());
				startSerie = false;
			}
			if (startUeberschrift) {
				if (startSubUeberschrift) {
					unterSuchungData.setSubUeberSchrift(subUeberschriftData);
				} else {
					unterSuchungData.setUeberSchrift(ueberSchriftData);
				}
			} else {
				items.add(unterSuchungData);
				unterSuchungData.setEntrag(eintragData);
				eintragData.setUnterItem(unterSuchungData);
			}

			DatabaseManager.getInstance().addUnterSuchung(unterSuchungData);
			startUntersuchung = false;
		} else if (localName.equals("Kuerzel")) {
			unterSuchungData.setKuerzel(elementValue);
		} else if (localName.equals("Name")) {
			unterSuchungData.setName(elementValue);
		} else if (localName.equals("Synonym")) {
			unterSuchungData.setSynonym(elementValue);
		} else if (localName.equals("MaterialKuerzel")) {
			unterSuchungData.setMaterialKuerzel(elementValue);
		} else if (localName.equals("MaterialName")) {
			unterSuchungData.setMaterialName(elementValue);
		} else if (localName.equals("MaterialAbnahmemenge")) {
			unterSuchungData.setMaterialAbnahmemenge(elementValue);
		} else if (localName.equals("Material")) {
			unterSuchungData.setMaterial(elementValue);
		} else if (localName.equals("Methode")) {
			unterSuchungData.setMethode(elementValue);
		} else if (localName.equals("Kommentar")) {
			unterSuchungData.setKommentar(elementValue);

		} else if (localName.equals("BemerkungLV")) {
			unterSuchungData.setBemerkungLv(elementValue);
		} else if (localName.equals("Preis")) {
			unterSuchungData.setPreis(elementValue);
		} else if (localName.equals("Dauer")) {
			unterSuchungData.setDauer(elementValue);
		} else if (localName.equals("Referenzbereich")) {
			unterSuchungData.setReferenzbereich(elementValue);
		} else if (localName.equals("Einheit")) {
			unterSuchungData.setEinheit(elementValue);
		} else if (localName.equals("Allgemeines")) {
			switch (anhagType) {
			case 1:
				kapitelData.setAnhang(elementValue);
				break;
			case 2:
				ueberSchriftData.setAllgemeines(elementValue);
				break;
			case 3:

				anhangData.setAllgemeines(elementValue);
				break;
			case 4:

				subUeberschriftData.setAllgemeines(elementValue);
				break;
			default:
				break;
			}

		} else if (localName.equals("Indikation")) {
			switch (anhagType) {
			case 2:
				ueberSchriftData.setIndikation(elementValue);
				break;
			case 3:

				anhangData.setIndikation(elementValue);
				break;
			case 4:

				subUeberschriftData.setIndikation(elementValue);
				break;
			default:
				break;
			}
		} else if (localName.equals("Praeanalytik")) {
			switch (anhagType) {

			case 2:
				ueberSchriftData.setPraeanalytik(elementValue);
				break;
			case 3:
				anhangData.setPraeanalytikr(elementValue);

				break;
			case 4:
				subUeberschriftData.setPraeanalytikr(elementValue);

				break;
			default:
				break;
			}
		} else if (localName.equals("Bewertung")) {
			switch (anhagType) {

			case 2:
				ueberSchriftData.setBewertung(elementValue);
				break;
			case 3:

				anhangData.setBewertung(elementValue);
				break;
			case 4:

				subUeberschriftData.setBewertung(elementValue);
				break;
			default:
				break;
			}
		} else if (localName.equals("Durchfuehrung")) {
			switch (anhagType) {

			case 2:
				ueberSchriftData.setDurchfuehrung(elementValue);
				break;
			case 3:

				anhangData.setDurchfuehrung(elementValue);
				break;
			case 4:

				subUeberschriftData.setDurchfuehrung(elementValue);
				break;
			default:
				break;
			}
		} else if (localName.equals("Kurzkommentar")) {
			switch (anhagType) {

			case 2:
				ueberSchriftData.setKurzkommentar(elementValue);
				break;
			case 3:

				anhangData.setKurzkommentar(elementValue);
				break;
			case 4:

				subUeberschriftData.setKurzkommentar(elementValue);
				break;
			default:
				break;
			}
		} else if (localName.equals("Serie")) {
			ueberSchriftData.setEintrag(eintragData);
			eintragData.setUeberItem(ueberSchriftData);
			DatabaseManager.getInstance().addUeberSchrift(ueberSchriftData);
			startUeberschrift = false;
		} else {
			elementValue = elementValue + "</" + localName + ">";
		}
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		elementValue = elementValue + (new String(ch, start, length));

	}

}
